package createobject

import (
	"clouds.lgb24kcs.cn/controllers/files/request"
	"clouds.lgb24kcs.cn/errorx"
	"clouds.lgb24kcs.cn/global"
	"clouds.lgb24kcs.cn/services/files"
	"clouds.lgb24kcs.cn/utils"
	"fmt"
	"github.com/gin-gonic/gin"
	"net/http"
	"os"
	"strconv"
	"strings"
)

var Log = global.APP.Log
var DIR, _ = os.Getwd()

//var wg sync.WaitGroup

func UploadChunk(c *gin.Context) {

	req := request.UploadFileReq{}
	file, _ := c.FormFile("file")
	filehash := c.PostForm("filehash") // 分片文件名称
	if err := c.ShouldBindQuery(&req); err != nil {
		utils.Fail(c, errorx.VerifyError, err.Error())
	} else {
		file_dir := strings.Split(filehash, "_")[len(strings.Split(filehash, "_"))-2]
		err := utils.PathExists(DIR + global.APP.Configuration.Server.Upload + "/" + file_dir)
		if err != nil {
			global.APP.Log.Error(fmt.Sprintf("创建目录错误：%s", err.Error()))
			utils.Fail(c, errorx.ObjectCreate, err.Error())
		} else {
			err := c.SaveUploadedFile(file, DIR+global.APP.Configuration.Server.Upload+"/"+file_dir+"/"+filehash) // 保存分片数据
			if err != nil {
				global.APP.Log.Error(err.Error())
			} else {
				c.JSON(http.StatusOK, gin.H{"code": 200})

			}
		}
	}
}

func MegerChunk(c *gin.Context) {
	//var wg sync.WaitGroup

	req := request.UploadFileReq{}
	userId := utils.CtxUserId(c)
	if err := c.ShouldBind(&req); err != nil {
		utils.Fail(c, errorx.VerifyError, err.Error())
	} else {
		hash := c.Query("hash")
		fileName := c.Query("fileName")
		dir, _ := os.ReadDir(DIR + global.APP.Configuration.Server.Upload + "/" + hash)
		file, err := os.OpenFile(DIR+global.APP.Configuration.Server.Upload+"/"+hash+"/"+fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
		if err != nil {
			global.APP.Log.Error(err.Error())
			utils.Fail(c, errorx.ObjectCreate, err.Error())
		} else {
			// 分片顺序读取并且合并代码
			for i := 0; i < len(dir); i++ {
				for _, item := range dir {
					//必须控制文件循序
					tmp := strings.Split(item.Name(), "_")[len(strings.Split(item.Name(), "_"))-1] // 结果：98.jpg
					// 取切片顺序
					index, _ := strconv.Atoi(strings.Split(tmp, ".")[0])
					if index == i {
						b, err := os.ReadFile(DIR + global.APP.Configuration.Server.Upload + "/" + hash + "/" + item.Name()) // 以字节的形式读取分片数据
						if err != nil {
							global.APP.Log.Error(err.Error())
							utils.Fail(c, errorx.ObjectCreate, err.Error())
						}
						_, err = file.Write(b)
						if err != nil {
							global.APP.Log.Error(fmt.Sprintf("文件写入错误：%s", err.Error()))
							utils.Fail(c, errorx.ObjectCreate, err.Error())
						}
					}

				}
			}
			stat, _ := os.Stat(DIR + global.APP.Configuration.Server.Upload + "/" + hash + "/" + fileName)
			file_dir := DIR + global.APP.Configuration.Server.Upload + "/" + hash + "/" + fileName
			// 如果文件的大小大于1MB就将字节转换为MB，如果不满足1Mb就按直接显示
			var size int64
			if stat.Size() > 1024*1024*1 {
				size = stat.Size() / 1024 / 1024
			} else {
				size = stat.Size()
			}
			files.File.Create(c, req, file_dir, fileName, userId, size)
		}

	}

}
